SuperMap Online(以下简称Online)是超图在线GIS平台,主要为用户提供在线的数据服务及GIS平台服务,帮助用户实现GIS数据的安全上云,提供丰富的工具对数据进行在线展示和分析。
SuperMap iMobile(以下简称iMobile)全面对接Online,在移动端使用Online强大的分析和展示能力,支持功能包括:
- 地理编码/逆地理编码
- 坐标转换
- POI搜索
- 公交换乘
- 在线导航
- 数据上传和下载
对接Online服务,需要在代码中传入密钥,获取密钥的方式如下:
(1).进入SuperMap Online主页,并的登录。若没有Online账号,需先注册。
图:登录SuperMap Online |
(2).登录后,点击用户名右侧的三角,在弹出框中,选择“账户信息”。
图:查看账户信息 |
(3).在“账户信息”界面,选择“我的密钥”,查看和获取应用密钥。
图:查看密钥 |
地理编码
在地理编码中,支持正向地理编码(地理编码)和反向地理编码(逆地理编码)。
地理编码
地理编码,能够将地名或地址描述转换为地球表面上相应位置。
操作步骤:
(1).设置参数:设置GeocodingParameter类中的参数,包括setCity、setLandmark等必填参数。若源坐标类型与目标坐标类型不一致,可通过setCoordinateType方法进行坐标类型设置。
(2). 设置回调:利用setGeocodingCallback()方法,设置回调,设置前,需要先用setKey()方法,设置密钥。
(3).地理编码:调用Geocoding类中的geocoding()方法,进行地理编码。
(4).处置结果:在编码成功的回调中,处置返回的数据。
参考代码:
//①参数设置
GeocodingParameter parameter = new GeocodingParameter(); //地理编码参数
parameter.setCity("北京市"); //设置地理编码分析城市范围(必填)
parameter.setLandmark("朝阳区酒仙桥北路超图软件"); //设置地理编码分析描述(必填)
parameter.setCoordinateType(CoordinateType.NAVINFO_AMAP_MERCATOR); //设置输出结果坐标类型
//②地理编码操作结果回调
Geocoding geocoding = new Geocoding(); //地理编码
geocoding.setKey(m_key); //设置密钥(必填)
geocoding.setGeocodingCallback(new Geocoding.GeocodingCallback() {
@Override
public void reverseGeocodeSuccess(GeocodingData data) { //反向地理编码成功
}
@Override
public void geocodeSuccess(List<GeocodingData> dataList) { //正向地理编码成功
//④结果处置
final int count = dataList.size(); //获取地理编码返回元素个数
String strRes = "";
for (int i = 0; i < count; i++) {
GeocodingData geocodingData = dataList.get(i); //获取地理编码数据
Point2D pos = geocodingData.getLocation(); //获取匹配输入地址描述的地理坐标
String strLoc = "X:" + String.valueOf(pos.getX()) + "Y:" + String.valueOf(pos.getY()) +";";
strRes += strLoc;
}
Toast.makeText(MainActivity.this, strRes, Toast.LENGTH_LONG).show();
}
@Override
public void geocodeFailed(String errorMsg) { //地理编码异常
Toast.makeText(MainActivity.this, "地理编码失败!", Toast.LENGTH_LONG).show();
}
});
//③进行地理编码
geocoding.geocoding(parameter);
逆地理编码
在逆地理编码中,能够将地球表面的坐标地址转换为标准地址。
操作步骤:
(1).设置回调:利用setGeocodingCallback()方法,设置回调,设置前,需要先用setKey()方法,设置密钥。
(2).逆地理编码:调用Geocoding类中的reverseGeocoding ()方法,进行逆地理编码。
(3).处置结果:在编码成功的回调中,处置返回的数据。
参考代码:
//①逆地理编码操作结果回调
Geocoding reverseGeocoding = new Geocoding();
reverseGeocoding.setKey(m_key); //设置密钥(必填)
reverseGeocoding.setGeocodingCallback(new Geocoding.GeocodingCallback() {
@Override
public void reverseGeocodeSuccess(GeocodingData data) { //反向地理编码成功
//③结果处置
Address address = data.getAddress();
String city = address.getCity();
String cuonty = address.getCounty();
StreetNumber streetNum = address.getStreetNumber();
String street = streetNum.getStreet();
String number = streetNum.getNumber();
String addressName = city + cuonty + street + number;
Toast.makeText(MainActivity.this, addressName, Toast.LENGTH_LONG).show();
}
@Override
public void geocodeSuccess(List<GeocodingData> dataList) { //正向地理编码成功
}
@Override
public void geocodeFailed(String errorMsg) { //地理编码异常
Toast.makeText(MainActivity.this, "逆地理编码失败!", Toast.LENGTH_LONG).show();
}
});
//②逆地理编码
Point2D srcPoint2D = new Point2D();
srcPoint2D.setX(Double.parseDouble("116.51221214922793"));
srcPoint2D.setY(Double.parseDouble("39.991848126454656"));
reverseGeocoding.reverseGeocoding(srcPoint2D);
坐标转换
在线进行坐标转换,支持的坐标类型包括百度经纬度,百度墨卡托,GPS经纬度, GPS墨卡托,四维、高德经纬度,四维、高德墨卡托, 搜狗墨卡托等。
操作步骤:
(1).设置参数:设置CoordinateConvertParameter类中的参数,包括setKey()、setPoint2Ds()等必填参数。若源坐标类型与目标坐标类型不一致,可通过setSrcCoordinateType()和setDestCoordinateType()方法进行坐标类型设置。
(2).设置回调:利用setConvertCallback ()方法,设置回调。
(3).坐标转换:调用CoordinateConvert类中的convert ()方法,进行坐标转换。
(4).处置结果:在转换成功的回调中,处置结果。
参考代码:
Point2Ds points = new Point2Ds();
Point2D point = new Point2D(104.073324,30.696837);
points.add(point);
//①参数设置
CoordinateConvertParameter parameter = new CoordinateConvertParameter(); //坐标转换参数
parameter.setKey(m_key); //设置密钥(必填)
parameter.setPoint2Ds(points); //预转换的坐标集合(必填)
parameter.setSrcCoordinateType(CoordinateType.NAVINFO_AMAP_LONGITUDE_LATITUDE); //原坐标集合的类型
parameter.setDestCoordinateType(CoordinateType.NAVINFO_AMAP_MERCATOR); //目标坐标的类型
//②设置坐标转换回调
CoordinateConvert coordConvert = new CoordinateConvert(this);
coordConvert.setConvertCallback(new CoordinateConvert.ConvertCallback() {
@Override
public synchronized void convertSuccesss(Point2Ds point2Ds) { //坐标转换成功
//④结果处置
int count = point2Ds.getCount();
String strRes = "";
for (int i=0; i<count; i++){
Point2D pnt = new Point2D();
pnt = point2Ds.getItem(i);
String strLoc = "X:" + String.valueOf(pnt.getX()) + "Y:" + String.valueOf(pnt.getY()) + ";";
strRes += strLoc;
}
Toast.makeText(MainActivity.this, strRes,Toast.LENGTH_SHORT).show();
}
@Override
public void convertFailed(String errInfo) { //坐标转换失败
Toast.makeText(MainActivity.this, "坐标转换失败!", Toast.LENGTH_LONG).show();
}
});
//③坐标转换
coordConvert.convert(parameter);
POI搜索
POI搜索服务,根据关键字或范围查询POI。
操作步骤:
(1).设置参数:设置POIQueryParameter类中的参数,包括setKey()、setKeywords ()等必填参数。若源坐标类型与目标坐标类型不一致,可通过setCoordinateType()方法进行坐标类型设置。
(2).设置回调:利用setPOIQueryCallback ()方法,设置回调。
(3).POI搜索:调用CoordinateConvert类中的convert ()方法,进行POI搜索。
(4).处置结果:在查询成功的回调中,处置结果。
(5).坐标转换(可选):若获取的结果的坐标类型与当前的坐标类型不一致,需进行坐标转换。
参考代码:
//①参数设置
POIQueryParameter queryParameter = new POIQueryParameter(); //POI查询参数
queryParameter.setKey(m_key); //设置密钥(必填)
queryParameter.setKeywords("超图"); //设置搜索关键字(必填)
queryParameter.setCity("北京市"); //设置POI服务查询范围
queryParameter.setCoordinateType(CoordinateType.BAIDU_LONGITUDE_LATITUDE); //设置输出结果坐标类型
//②POI查询回调
POIQuery poiQuery = new POIQuery(this);
poiQuery.setPOIQueryCallback(new POIQuery.POIQueryCallback() {
@Override
public void querySuccess(final POIQueryResult queryResult) { //查询成功
//④结果处置
final POIInfo[] poiInfos = queryResult.getPOIInfos();
String strRes = "";
Point2Ds point2Ds = new Point2Ds();
for(int i=0; i<poiInfos.length; i++){
Point2D point2D = poiInfos[i].getLocation();
point2Ds.add(point2D);
String name = poiInfos[i].getName() + ";" ;
strRes += name;
}
Toast.makeText(MainActivity.this, strRes,Toast.LENGTH_SHORT).show();
//⑤坐标转换(可选,略)
}
@Override
public void queryFailed(String errInfo) { //查询失败
Toast.makeText(MainActivity.this, "POI搜索失败",Toast.LENGTH_SHORT).show();
}
});
//③POI查询
poiQuery.query(queryParameter);
公交换乘
在线公交换乘类,查询公交路线。
操作步骤:
(1).设置参数:设置TrafficTransferParameter类中的参数。
(2).设置回调:利用setTransferCallback ()方法,设置回调。设置前,需要先用setKey()方法,设置密钥。
(3).公交换乘:调用TrafficTransferOnline类中的trafficTransfer ()方法,进行公交换乘分析。
(4).处置结果:在分析成功的回调中,处置结果。
参考代码:
Point2D startPoint=new Point2D(104.068480, 30.537340);
Point2D destPoint=new Point2D(104.073324, 30.696837);
//①参数设置
TrafficTransferParameter ttParameter = new TrafficTransferParameter();
ttParameter.setCoordinateType(CoordinateType.NAVINFO_AMAP_MERCATOR); //设置坐标类型
ttParameter.setStartName("超图软件"); //设置起点名称
ttParameter.setDestinationName("成都火车站"); //设置终点名称
ttParameter.setQueryCity("成都"); //设置公交换乘服务查询范围
ttParameter.setTrafficType(1); //设置公交换乘策略。0表示正常模式,1表示不走地铁。
ttParameter.setResultCount(3); //设置最大换乘方案个数
//②公交换乘回调
TrafficTransferOnline trafficTransferOnline = new TrafficTransferOnline(); //在线公交换乘
trafficTransferOnline.setKey(m_key); //设置密钥
trafficTransferOnline.setTransferCallback(new TrafficTransferOnline.TransferCallback() {
@Override
public void transferSuccess(TrafficTransferOnlineData data) { //公交换乘查询成功
//④结果处置
List<SolutionItem> solutionItems = data.getSolutionItems();
int solutionItemCount = solutionItems.size();
String strRes = "";
for(int i=0; i<solutionItemCount; i++){
SolutionItem solutionItem = solutionItems.get(i); //获取换乘方案
List<LineItems> lineItemsList = solutionItem.getLinesItems(); //具体公交换乘线路信息
int lineItemsCount = lineItemsList.size();// 获取有多少个lineItems方案
for(int j=0; j < lineItemsCount; j++){
List<LineItem> lineItemList = lineItemsList.get(j).getLineItems();
int lineItemCount = lineItemList.size(); // 获取有多少个lineItem方案
for(int k=0;k<lineItemCount;k++){
LineItem lineItem=lineItemList.get(k);//获取当前线路
String strLineName=lineItem.getLineName();//得到当前分段乘坐的公交(地铁)线路名称
String strStartStopName=lineItem.getStartStopName();//得到当前分段起始公交(地铁)站名称
String strEndStopName=lineItem.getEndStopName();//得到当前分段终点公交(地铁)站名称
String strDirection=lineItem.getLineDirection();//得到分段线路的方向
String strPassStopCount=String.valueOf(lineItem.getPassStopCount());//得到总经历的站次数
String strWalkDistance=String.valueOf(lineItem.getWalkDistance());//得到从起始点到公交(地铁)起点的步行距离
strRes = strRes + strLineName + ";" + strStartStopName + ";" + strEndStopName + ";" + strDirection + ";" + strPassStopCount + ";" + strWalkDistance ;
}
}
}
Toast.makeText(MainActivity.this, strRes,Toast.LENGTH_SHORT).show();
}
@Override
public void transferFailed(String errorInfo) { //公交换乘查询失败
Toast.makeText(MainActivity.this, "公交换乘分析失败",Toast.LENGTH_SHORT).show();
}
});
//③公交换乘
trafficTransferOnline.trafficTransfer(startPoint, destPoint, ttParameter);
在线导航
在线导航,通过输入导航的起点和终点、道路类型等,规划路径和导航。
操作步骤:
(1).设置参数:设置NavigationOnlineParameter类中的参数。
(2).设置回调:利用setNavigationOnlineCallback ()方法,设置回调。设置前,需要先用setKey()方法,设置密钥。
(3).路径分析:调用NavigationOnline类中的routeAnalyst ()方法,进行路径分析。
(4).处置结果:在分析成功的回调中,处置结果。
参考代码:
Point2D startPoint = new Point2D(104.068480,30.537340);
Point2D endPoint = new Point2D(104.073324,30.696837);
//①参数设置
NavigationOnlineParameter parameter = new NavigationOnlineParameter();
parameter.setStartPoint(startPoint); //设置路径规划的起点
parameter.setEndPoint(endPoint); //设置路径规划的终点
parameter.setCoordinateType(CoordinateType.NAVINFO_AMAP_MERCATOR); //设置坐标类型
parameter.setRouteType(RouteType.MIN_LENGTH); //设置道路类型
//②在线导航回调
NavigationOnline navigationOnline = new NavigationOnline(); //在线导航
navigationOnline.setKey(m_key); //设置密钥(必填)
navigationOnline.setNavigationOnlineCallback( new NavigationOnline.NavigationOnlineCallback() {
@Override
public void calculateSuccess(NavigationOnlineData data) { //路径分析成功
//④结果处置
String time = data.getTime();
String length = data.getLength();
String strRes = time + "," + length + ":" ;
GeoLine line = data.getRoute();
int nCount = line.getPartCount();
for (int i = 0; i < nCount ; i++){
double len = line.getLength();
String strLen = String.valueOf(len);
strRes = strRes + strLen + ",";
}
Toast.makeText(MainActivity.this, strRes,Toast.LENGTH_SHORT).show();
}
@Override
public void calculateFailed(String errorInfo) { //路径分析失败
Toast.makeText(MainActivity.this, "路径分析失败!",Toast.LENGTH_SHORT).show();
}
});
//③路径分析
navigationOnline.routeAnalyst(parameter);
数据上传和下载
移动端与SuperMap Online进行数据的上传和下载,数据交互前,需先调用OnlineService类的login()方法进行登录。
参考代码:
OnlineService onlineService=new OnlineService(MainActivity.this);
onlineService.login("username@supermap.com", "password", new OnlineService.LoginCallback() {
@Override
public void loginSuccess() {
runOnUiThread(new Thread(){
public void run(){
Toast.makeText(MainActivity.this, "登陆成功!",Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void loginFailed(String s) {
Toast.makeText(MainActivity.this, "登陆失败!",Toast.LENGTH_SHORT).show();
}
});
数据上传
支持终端上的数据上传到服务端。使用OnlineService类中的uploadFile()方法。
参考代码:
OnlineService onlineService = new OnlineService(MainActivity.this);
//上传文件
onlineService.uploadFile("SuperMapCloud", SDCARD + "/SuperMap/data/SuperMapCloud.zip", new UpLoadFile.UpLoadListener() {
@Override
public void getProgress(final int i) { //当前上传进度的百分比
runOnUiThread(new Thread(){
public void run(){
Toast.makeText(MainActivity.this,String.valueOf(i),Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onComplete() { //上传完成
Looper.prepare();
Toast.makeText(MainActivity.this, "上传成功",Toast.LENGTH_SHORT).show();
Looper.loop();
}
@Override
public void onFailure() { //上传失败
Looper.prepare();
Toast.makeText(MainActivity.this, "上传失败",Toast.LENGTH_SHORT).show();
Looper.loop();
}
});
数据下载
支持下载服务端的数据到终端。使用OnlineService类中的downloadFile ()方法。
参考代码:
//下载文件
OnlineService.downloadFile(MainActivity.this, "PearlRiverDelta", SDCARD + "/SuperMap/data/PearlRiverDelta.zip", new DownLoadFile.DownLoadListener() {
@Override
public void getProgress(final int i) { //当前下载进度的百分比
runOnUiThread(new Thread(){
public void run(){
Toast.makeText(MainActivity.this,String.valueOf(i),Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onComplete() { //下载成功
}
@Override
public void onFailure() { //下载失败
}
});